﻿using System;
using vtpsms.dao.dal.Repository;
using vtpsms.dao.Models;

namespace vtpsms.dao.dal
{
    /// <summary>
    /// Quản lý các repository và context kết nối đến csdl
    /// Khởi tạo transaction
    /// </summary>
    public class UnitOfWork : IUnitOfWork
    {
        public UnitOfWork()
        {
            context = new vtpsmsContext();
        }

        #region CONTEXT
        private vtpsmsContext context;
        ///
        ///TODO: Thêm context kết nối đến csdl ở đây
        ///TODO: Thêm hàm hởi tạo unitofwork => khởi tạo context
        ///
        public vtpsmsContext Context
        {
            get
            {
                if (this.context == null)
                {
                    throw new Exception("Could not access DB::errors");
                }
                return this.context;
            }
        }
        #endregion

        #region REPOSITORY
        /// <summary>
        /// Customer Repository
        /// </summary>
        private CustomerRepository _repository;
        public CustomerRepository CustomerRepository
        {
            get { return _repository ?? (_repository = new CustomerRepository(context)); }
        }
        /// <summary>
        /// Group Repository
        /// </summary>
        private GroupRepository _grepository;
        public GroupRepository GroupRepository
        {
            get { return _grepository ?? (_grepository = new GroupRepository(context)); }
        }
        /// <summary>
        /// Sms Repository
        /// </summary>
        private SmsRepository _smsrepository;
        public SmsRepository SmsRepository
        {
            get { return _smsrepository ?? (_smsrepository = new SmsRepository(context)); }
        }
        #endregion

        #region SAVE AND DISPOSE DATA

        /// <summary>
        /// Lưu dữ liệu xuống server
        /// </summary>
        public void Save()
        {
            context.SaveChanges();
        }

        private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    context.Dispose();
                }
            }
            this.disposed = true;
        }

        /// <summary>
        /// Lưu vào giải phóng kết nối
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        #endregion SAVE AND DISPOSE DATA
    }
}
